<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul>
        <li>1111</li>
        <li>2222</li>
        <li>3333</li>
        <li>4444</li>
        <li>55555</li>
    </ul>
    <script>
        // function add(a, b) {
        //     console.log(a + b)
        // }
        // add(1, 3)
        // GO作用域的变量会被一直保存，造成内存浪费






        // 自动执行，执行完成后立即释放
        // 立即执行函数 - 初始化函数

        // (function add(a, b) {
        //     console.log(a + b)
        // }(1, 3))
        // add(3, 4) // 报错，立即执行函数执行完立即释放了





        // (function test1() {
        //     console.log('test1')
        // })()

        // let test2 = function() {
        //     console.log('test2')
        // }()

        // function test3() {
        //     console.log('test3')
        // }() // 报错

        // 一定是表达式才能被执行符号执行，函数声明不可以


        // var test = function() {
        //     console.log(1)
        // };
        // var test2 = function() {
        //     console.log(2)
        // }()
        // console.log(test)
        // console.log(test2) // undefined
        // 立即执行函数执行完被释放，所以任何形式的命名对立即执行函数都是无效的




        // 函数声明变成表达式的方法 + - ! || &&（只要不是单纯的一行代码： function  funcName(){},其他都是函数表达式）

        // 1 && function test() {
        //     console.log(111)
        // }()





        // 逗号运算符（返回最后一个）

        // var a = (1, 2, 3)
        // console.log(a)



        // function aaa() {

        // } (2) // 这个位置如果不传参数，空的(),会报错，因为函数声明不能立即执行
        // // 如果有参数什么都不执行，原因是被解析成如下：

        // function aaa() {

        // }

        // (2)




        // function test() {
        //     let arr = []
        //     for (var i = 0; i < 10; i++) {
        //         (function (j) {
        //             arr[i] = function () {
        //                 console.log(j)
        //             }
        //         })(i)
        //     }
        //     return arr
        // }
        // // 不用立即执行函数会全打印10，因为return的时候i=10
        // // 因为我传进去j，是立即执行的
        // var funsArr = test()
        // funsArr[0]()
        // funsArr[1]()
        // funsArr[2]()
        // funsArr[3]()
        // funsArr[4]()
        // funsArr[5]()


        // var oLi = document.querySelectorAll('li')
        // for (var i = 0; i < oLi.length; i++) {
        //     (function(j) {
        //         oLi[j].onclick = function() {
        //             console.log(j + 1)
        //         }
        //     }(i))
        // }



        // var a = 10;
        // if (function b() {}) { // 浏览器解析为 (function b() {})，不是函数声明，则b并不存在
        //     a += typeof(b) // string类型的undefined
        // }
        // console.log(a)




        // 作业：
        // 累加器
        // function test() {
        //     var a = 1

        //     function add() {
        //         a++;
        //         console.log(a)
        //     }
        //     return add
        // }
        // let newTest = test()
        // newTest()
        // newTest()
        // newTest()
        // newTest()
        // newTest()



        // function classGrade() {
        //     var arr = ['小吕', '小黄', '小王']

        //     function add(name) {
        //         if (~arr.indexOf(name)) {
        //             console.log('该同学已在班级中')
        //             return
        //         }
        //         arr.push(name)
        //         console.log(arr)
        //     }

        //     function reduce(name) {
        //         if (~arr.indexOf(name)) {
        //             arr.splice(~arr.indexOf(name) - 1, 1)
        //             console.log(arr)
        //             return
        //         }
        //         console.log('该同学不在班级中')
        //     }
        //     return {
        //         add,
        //         reduce
        //     }
        // }

        // var classGrade1 = classGrade()
        // classGrade1.add('小马')
        // classGrade1.reduce('小黄')
        // classGrade1.add('小马')
        // classGrade1.reduce('小郭')



        // var arr = ['小吕', '小黄', '小王']


        // console.log(~arr.indexOf('小吕')) // -1,-2,-3    不存在的全是0,所以可以用来在if中判断是否存在，隐式类型转换
    </script>
</body>

</html>